﻿/*
 * HCC Robotica, Workshop Robot programmeren met C# 
 * Oefening : wo_08 Analoge sensor kalibreren
 * Naam     : Hinnie
 * Versie   : september 2011 
 */

using System;
using System.Threading;
using System.IO.Ports;
using System.Text;

using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.FEZ;

namespace wo_08
{
    public class Program
    {
        public static void Main()
        {
            OutputPort LED = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.LED, false);
            AnalogIn SEN = new AnalogIn((AnalogIn.Pin)FEZ_Pin.AnalogIn.An6);
            SerialPort ComPort = new SerialPort("COM2", 115200);
            bool ledState = false;
            bool ledSwitch = false;
            const int loopTime = 5;                     // na elke doorloop mwordt er 5 ms gewacht 
            const int flashTime = 200 / loopTime;       // led knipper tijd is 200 ms
            const int reportTime = 500 / loopTime;      // iedere 500 ms wordt er gerapporteerd 

            ComPort.Open();
            byte[] txBuf;
            string Msg = "";

            int min = 1023;                             // is de maximale waarde wordt kleiner na een meting
            int max = 0;                                // is de minimale waarde wordt groter na een meting    
            double cft;                                 // is de corectie factor
            int val;
            int tmp;
            int res;

            int flashCount = 0;
            int reportCount = 0;
            while (true)
            {
                val = SEN.Read();                       // uitlezen van de sensor
                if (min > val)                  
                    min = val;
                if (max < val)
                    max = val;

                cft = (double)(max - min) / 100;        // de correctie factor wordt steeds bepaald omdat er geen kalibratie stop is afgesproken
                if (cft == 0) cft = 1;                  // komt niet voor maar voor de zekerheid, want later wordt deze factor gebruikt als noemer 

                if (reportCount++ >= reportTime)        // 
                {
                    reportCount = 0;
                    tmp = val;
                    if (tmp < min)                      // als blijkt dat na het kalibreren er toch een waarde buiten de grenzen worden uitlezen dan de waarde aanpassen
                        tmp = min;
                    if (tmp > max)
                        tmp = max;
                    res = (int)((tmp - min) / cft);     // res is de gecorrigeerde waarde

                    Msg = "v= " + val.ToString() + " min= " + min.ToString() + " max= " + max.ToString() + " c= " + cft.ToString() + " k= " + res.ToString() + "\n\r";
                    txBuf = Encoding.UTF8.GetBytes(Msg);    // Msg is een samensgestelde string met de resultaten
                    ComPort.Write(txBuf, 0, txBuf.Length);      
                }

                if (flashCount++ >= flashTime)
                {
                    flashCount = 0;
                    ledState = !ledState;    	// toggle LED state
                    LED.Write(ledState);     	// blink onboard LED
                }
                if (ledState)
                { 
                    ledSwitch = !ledSwitch;
                    LED.Write(ledSwitch);       // less intensity onboard LED
                }
                Thread.Sleep(loopTime);
            }
        }
    }
}

